import { HttpException, Inject, Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { Sms } from './entities/sms.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';

@Injectable()
export class SmsService {
  @Inject('SMS_CLIENT')
  private smsClient: any;

  constructor(
    private configService: ConfigService,
    @InjectRepository(Sms)
    private readonly smsRepository: Repository<Sms>,
  ) {}

  async send(phone: string): Promise<string> {
    const code = await this.generateRandomCode();

    const params = {
      /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId，示例如1400006666 */
      // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
      SmsSdkAppId: this.configService.get('sms.appId'),
      /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名 */
      // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
      SignName: this.configService.get('sms.signName'),
      /* 模板 ID: 必须填写已审核通过的模板 ID */
      // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
      TemplateId: this.configService.get('sms.templateCode'),
      /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致，若无模板参数，则设置为空 */
      TemplateParamSet: [code],
      /* 下发手机号码，采用 e.164 标准，+[国家或地区码][手机号]
       * 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号*/
      PhoneNumberSet: [`+86${phone}`],
      /* 用户的 session 内容（无需要可忽略）: 可以携带用户侧 ID 等上下文信息，server 会原样返回 */
    };
    const result = await this.smsClient.SendSms(params);
    if (
      result.SendStatusSet?.length &&
      result.SendStatusSet[0]?.Code === 'Ok'
    ) {
      const sms = await this.smsRepository.findOneBy({ phone });
      if (sms) {
        await this.smsRepository.update(sms.id, { code });
      } else {
        await this.smsRepository.save({
          phone,
          code,
        });
      }
      return '短信发送成功';
    } else {
      throw new HttpException(
        result.SendStatusSet.length
          ? result.SendStatusSet[0]?.Message
          : '短信发送失败',
        500,
      );
    }
  }

  // 6位随机验证码
  async generateRandomCode(): Promise<string> {
    const code = Math.floor(Math.random() * 1000000)
      .toString()
      .padStart(6, '0');
    return code;
  }
}
